home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / tex / tools / dvi / img.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-22  |  2.3 KB  |  111 lines

  1. #include <portab.h>
  2.  
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #include "mintbind.h"
  7. #include "treiber.h"
  8.  
  9.  
  10.  
  11. /* Versucht Zeile zu Komprimieren */
  12. WORD    compress_img_run( UBYTE *ziel, UBYTE *p, WORD *limit )
  13. {
  14.     UBYTE    i;
  15.  
  16.         /* Sonst getrennt */
  17.     if(  p[0]==0xFF  ||  p[0]==0  )
  18.     {
  19.         for(  i=1;  p[i]==p[0]  &&  i<*limit  &&  i<0x7F;  i++  )
  20.             ;
  21.         ziel[0] = (0x80 & p[0]) | i;
  22.         (*limit) -= i;
  23.         return 1;
  24.     }
  25.     else
  26.     {
  27.         /* Abstand zum nächsten Ungleichen... */
  28.         for(  i=0;  p[i]!=0  &&  p[i]!=0xFF  &&  i<127  &&  i<*limit;  i++  )
  29.             ziel[i+2] = p[i];
  30.         ziel[0] = 0x80;
  31.         ziel[1] = i;
  32.         (*limit) -= i;
  33.         return i+2;
  34.     }
  35. }
  36. /* 17.1.93 */
  37.  
  38.  
  39. typedef struct {
  40.     unsigned version;
  41.     unsigned headlen;
  42.     unsigned nplanes;
  43.     unsigned patlen;
  44.     unsigned pixelw;
  45.     unsigned pixelh;
  46.     unsigned linew;
  47.     unsigned lines;
  48. /*    unsigned palette[16]; Sind eh monochrom */
  49. } IMGHEADER;
  50.  
  51.  
  52. UBYTE            line[8192];
  53.  
  54. /* Schreibe in DVI-Datei */
  55. WORD    drucke( UBYTE *p, LONG weite, LONG max_zeile, LONG h_dpi, LONG v_dpi )
  56. {
  57.     IMGHEADER    hdr;
  58.     WORD            max_spalte, zeile, lz;
  59.     WORD            rep, th, i;
  60.     UBYTE            l;
  61.  
  62.     th = (WORD)get_tempfile( "img" );
  63.     if(  th<0  )
  64.         return -1;
  65.  
  66.         /* Header */
  67.     hdr.version = 1;
  68.     hdr.headlen = (WORD)sizeof(IMGHEADER)/2;
  69.     hdr.nplanes = 1;
  70.     hdr.patlen = 2;
  71.         /* Grafikauflösung festlegen */
  72.     hdr.pixelw = (WORD)((25400L+h_dpi/2)/h_dpi);
  73.     hdr.pixelh = (WORD)((25400L+v_dpi/2)/v_dpi);
  74.         /* Grafikweite festlegen */
  75.     hdr.linew = (WORD)weite;
  76.     hdr.lines = (WORD)max_zeile;
  77.     Fwrite( th, sizeof(IMGHEADER), &hdr );
  78.  
  79.     max_spalte = (WORD)((weite+7)/8);
  80.     zeile = 0;
  81.     weite = (weite+15)/16;
  82.     weite *= 2;
  83.  
  84.     while(  zeile<max_zeile  )
  85.      {
  86.              /* Zeilenkopf */
  87.              /* gleiche Zeilen komprimieren */
  88.          for(  l=1;  0==memcmp( p, p+weite, max_spalte )  &&  zeile<max_zeile  &&  l<255;  l++, zeile++  )
  89.              p += weite;
  90.          Fwrite( th, 3L, "\0\0\xFF" );
  91.         Fwrite( th, 1L, &l );
  92.  
  93.             /* Eine Zeile in die Datei! */
  94.         rep = lz = max_spalte;
  95.         i = 0;
  96.             /* Wir komprimieren (es bleibt auch nichts übrig) */
  97.         while(  lz>0  )
  98.             i += compress_img_run( line+i, p+rep-lz, &lz );
  99.         Fwrite( th, (LONG)i, line );
  100.  
  101.         p += weite;
  102.         zeile++;
  103.     }
  104.     Fclose( th );
  105.     /* Sollte immer gut gehen! (d.h. kein File zum Drucken!) */
  106.     return 0;
  107. }
  108. /* 22.1.93 */
  109.  
  110.  
  111.